package com.anim;

/**
 * Created by ege on 3.04.2017.
 */

import android.animation.ArgbEvaluator;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.FrameLayout;

public class DiscrollvableView extends FrameLayout implements Discrollvable {

  private static final int TRANSLATION_FROM_TOP = 0x01;
  private static final int TRANSLATION_FROM_BOTTOM = 0x02;
  private static final int TRANSLATION_FROM_LEFT = 0x04;
  ;
  private static final int TRANSLATION_FROM_RIGHT = 0x08;

  private static ArgbEvaluator sArgbEvaluator = new ArgbEvaluator();

  private float mDiscrollveThreshold;
  private int mDiscrollveFromBgColor;
  private int mDiscrollveToBgColor;
  private boolean mDiscrollveAlpha;
  private int mDiscrollveTranslation;
  private boolean mDiscrollveScaleX;
  private boolean mDiscrollveScaleY;

  private int mWidth;
  private int mHeight;

  public DiscrollvableView(Context context) {
    super(context);
  }

  public DiscrollvableView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public DiscrollvableView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }

  @Override protected void onFinishInflate() {
    super.onFinishInflate();
    onResetDiscrollve();
  }

  @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    mWidth = w;
    mHeight = h;
  }

  public void setDiscrollveTranslation(int discrollveTranslation) {
    mDiscrollveTranslation = discrollveTranslation;
    if (isDiscrollveTranslationFrom(TRANSLATION_FROM_BOTTOM) && isDiscrollveTranslationFrom(
        TRANSLATION_FROM_TOP)) {
      throw new IllegalArgumentException("cannot translate from bottom and top");
    }
    if (isDiscrollveTranslationFrom(TRANSLATION_FROM_LEFT) && isDiscrollveTranslationFrom(
        TRANSLATION_FROM_RIGHT)) {
      throw new IllegalArgumentException("cannot translate from left and right");
    }
  }

  public void setDiscrollveThreshold(float discrollveThreshold) {
    if (discrollveThreshold < 0.0f || discrollveThreshold > 1.0f) {
      throw new IllegalArgumentException("threshold must be >= 0.0f and <= 1.0f");
    }
    mDiscrollveThreshold = discrollveThreshold;
  }

  public void setDiscrollveFromBgColor(int discrollveFromBgColor) {
    mDiscrollveFromBgColor = discrollveFromBgColor;
  }

  public void setDiscrollveToBgColor(int discrollveToBgColor) {
    mDiscrollveToBgColor = discrollveToBgColor;
  }

  public void setDiscrollveAlpha(boolean discrollveAlpha) {
    mDiscrollveAlpha = discrollveAlpha;
  }

  public void setDiscrollveScaleX(boolean discrollveScaleX) {
    mDiscrollveScaleX = discrollveScaleX;
  }

  public void setDiscrollveScaleY(boolean discrollveScaleY) {
    mDiscrollveScaleY = discrollveScaleY;
  }

  @Override public void onDiscrollve(float ratio) {
    if (ratio >= mDiscrollveThreshold) {
      ratio = withThreshold(ratio);
      float ratioInverse = 1 - ratio;

      if (mDiscrollveAlpha) {
        setAlpha(ratio);
      }
      if (isDiscrollveTranslationFrom(TRANSLATION_FROM_BOTTOM)) {
        setTranslationY(mHeight * ratioInverse);
      }
      if (isDiscrollveTranslationFrom(TRANSLATION_FROM_TOP)) {
        setTranslationY(-mHeight * ratioInverse);
      }
      if (isDiscrollveTranslationFrom(TRANSLATION_FROM_LEFT)) {
        setTranslationX(-mWidth * ratioInverse);
      }
      if (isDiscrollveTranslationFrom(TRANSLATION_FROM_RIGHT)) {
        setTranslationX(mWidth * ratioInverse);
      }
      if (mDiscrollveScaleX) {
        setScaleX(ratio);
      }
      if (mDiscrollveScaleY) {
        setScaleY(ratio);
      }
      if (mDiscrollveFromBgColor != -1 && mDiscrollveToBgColor != -1) {
        setBackgroundColor(
            (Integer) sArgbEvaluator.evaluate(ratio, mDiscrollveFromBgColor, mDiscrollveToBgColor));
      }
    }
  }

  private float withThreshold(float ratio) {
    return (ratio - mDiscrollveThreshold) / (1.0f - mDiscrollveThreshold);
  }

  @Override public void onResetDiscrollve() {
    if (mDiscrollveAlpha) {
      setAlpha(0.0f);
    }
    if (isDiscrollveTranslationFrom(TRANSLATION_FROM_BOTTOM)) {
      setTranslationY(mHeight);
    }
    if (isDiscrollveTranslationFrom(TRANSLATION_FROM_TOP)) {
      setTranslationY(-mHeight);
    }
    if (isDiscrollveTranslationFrom(TRANSLATION_FROM_LEFT)) {
      setTranslationX(-mWidth);
    }
    if (isDiscrollveTranslationFrom(TRANSLATION_FROM_RIGHT)) {
      setTranslationX(mWidth);
    }
    if (mDiscrollveScaleX) {
      setScaleX(0.0f);
    }
    if (mDiscrollveScaleY) {
      setScaleY(0.0f);
    }
    if (mDiscrollveFromBgColor != -1 && mDiscrollveToBgColor != -1) {
      setBackgroundColor(mDiscrollveFromBgColor);
    }
  }

  private boolean isDiscrollveTranslationFrom(int translationMask) {
    return mDiscrollveTranslation != -1
        && (mDiscrollveTranslation & translationMask) == translationMask;
  }
}